package com.smart.community.user.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.smart.community.user.entity.User;
import com.smart.community.commons.enums.UserTypeEnum;

/**
 * 数据权限控制服务
 * 
 * @author Wu.Liang
 */
@Service
public class DataScopeService {
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private UserPropertyCompanyService userPropertyCompanyService;
    
    /**
     * 检查用户是否为超级管理员
     * @param user 用户对象
     * @return 是否为超级管理员
     * @throws Exception 统一异常
     */
    public boolean isSuperAdmin(User user) throws Exception {
        return user != null && UserTypeEnum.SUPER_ADMIN.getCode().equals(user.getUserType());
    }
    
    /**
     * 检查用户是否为超级管理员
     * @param userId 用户ID
     * @return 是否为超级管理员
     * @throws Exception 统一异常
     */
    public boolean isSuperAdmin(Long userId) throws Exception {
        User user = userService.getById(userId);
        return isSuperAdmin(user);
    }
    
    /**
     * 获取用户数据权限范围
     * 
     * @param userId 用户ID
     * @return 数据权限范围
     * @throws Exception 统一异常
     */
    public DataScope getUserDataScope(Long userId) throws Exception {
        // 超级管理员拥有所有数据权限
        if (isSuperAdmin(userId)) {
            return DataScope.ALL;
        }
        
        // 普通用户只能查看所属物业公司的数据
        List<Long> companyIds = userPropertyCompanyService.getUserCompanyIds(userId);
        return new DataScope(companyIds);
    }
    
    /**
     * 验证用户是否有权限访问指定数据
     * 
     * @param userId 用户ID
     * @param dataId 数据ID
     * @param dataType 数据类型
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    public boolean hasDataPermission(Long userId, Long dataId, String dataType) throws Exception {
        DataScope dataScope = getUserDataScope(userId);
        
        // 超级管理员拥有所有权限
        if (dataScope.isAll()) {
            return true;
        }
        
        // 普通用户权限验证
        return dataScope.contains(dataId, dataType);
    }
    
    /**
     * 数据权限范围类
     */
    public static class DataScope {
        private final List<Long> companyIds;
        private final boolean isAll;
        
        public DataScope(List<Long> companyIds) {
            this.companyIds = companyIds;
            this.isAll = false;
        }
        
        public DataScope(boolean isAll) {
            this.companyIds = null;
            this.isAll = isAll;
        }
        
        public static final DataScope ALL = new DataScope(true);
        
        public List<Long> getCompanyIds() {
            return companyIds;
        }
        
        public boolean isAll() {
            return isAll;
        }
        
        public boolean contains(Long dataId, String dataType) {
            if (isAll) {
                return true;
            }
            
            // 根据数据类型进行权限验证
            switch (dataType) {
                case "PROPERTY_COMPANY":
                    return companyIds != null && companyIds.contains(dataId);
                case "COMMUNITY":
                    // 社区权限验证逻辑
                    return true;
                case "BUILDING":
                    // 楼栋权限验证逻辑
                    return true;
                case "HOUSEHOLD":
                    // 房户权限验证逻辑
                    return true;
                default:
                    return false;
            }
        }
    }
} 